SpringBoot整合Drools

您所在的位置:网站首页 drools update SpringBoot整合Drools

SpringBoot整合Drools

#SpringBoot整合Drools| 来源: 网络整理| 查看: 265

文章目录 关于Drools整合Drools一般流程快速整合

关于Drools

博客: 规则引擎 Drools 上面那篇博客详细的介绍了Drools,还要语法规则,关于什么是Drools,看这篇博客完全足够了。

下面的重点是springboot整合drools

整合Drools 一般流程

创建一个springboot项目,不会创建的可以参考这篇博客:【Spring Boot】快速上手SpringBoot

引入我们的drools依赖:

org.kie kie-spring 7.37.0.Final org.drools drools-compiler 7.37.0.Final

配合测试可能还需要引入的依赖:

junit junit 4.13.2 test org.projectlombok lombok 1.18.20 配置好我们的工具类KieSessionUtils,后面可以直接调用即可: package com.gaolang.utils; import org.drools.decisiontable.InputType; import org.drools.decisiontable.SpreadsheetCompiler; import org.kie.api.KieBase; import org.kie.api.KieServices; import org.kie.api.builder.*; import org.kie.api.event.rule.DebugRuleRuntimeEventListener; import org.kie.api.io.Resource; import org.kie.api.io.ResourceType; import org.kie.api.runtime.KieContainer; import org.kie.api.runtime.KieSession; import org.kie.api.runtime.StatelessKieSession; import org.kie.internal.utils.KieHelper; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.InputStream; import java.util.List; /** * * 1.维护了有状态和无状态的两种Session对象,不推荐使用get。 * 2.全局的Session已经在config下的Configuration中自动装配了。 * 3.无并发的情况下,使用newKieSession()既可。 * @author Hong Wen 2018/04/04 * */ public class KieSessionUtils { private static KieSession kieSession; private static final String RULES_PATH = "rules/"; private KieSessionUtils() { } /** * @description TODO(创建包含所有规则的对象) * @throws Exception * @return KieSession */ public static KieSession getAllRules() throws Exception { try { disposeKieSession(); KieServices kieServices = KieServices.Factory.get(); KieFileSystem kieFileSystem = kieServices.newKieFileSystem(); for (org.springframework.core.io.Resource file : new PathMatchingResourcePatternResolver().getResources("classpath*:" + RULES_PATH + "**/*.*")) { kieFileSystem.write(org.kie.internal.io.ResourceFactory.newClassPathResource(RULES_PATH + file.getFilename(), "UTF-8")); } final KieRepository kieRepository = KieServices.Factory.get().getRepository(); kieRepository.addKieModule(new KieModule() { @Override public ReleaseId getReleaseId() { return kieRepository.getDefaultReleaseId(); } }); KieBuilder kieBuilder = KieServices.Factory.get().newKieBuilder(kieFileSystem); kieBuilder.buildAll(); kieSession = KieServices.Factory.get().newKieContainer(kieRepository.getDefaultReleaseId()).newKieSession().getKieBase().newKieSession(); return kieSession; } catch (Exception ex) { throw ex; } } /** * @description TODO (快速新建KieSession) * @param classPath 绝对路径 * @return KieSession 有状态 */ public static KieSession newKieSession(String classPath) throws Exception { KieSession kieSession = getKieBase(classPath).newKieSession(); kieSession.addEventListener(new DebugRuleRuntimeEventListener()); return kieSession; } /** * @description TODO (快速新建StatelessKieSession) * @param classPath 绝对路径 * @return StatelessKieSession 无状态 */ public static StatelessKieSession newStatelessKieSession(String classPath) throws Exception { StatelessKieSession kiesession = getKieBase(classPath).newStatelessKieSession(); return kiesession; } /** * @description TODO (清空对象) * @title disposeKieSession 重置KieSession * @return void */ public static void disposeKieSession() { if (kieSession != null) { kieSession.dispose(); kieSession = null; } } protected static KieBase getKieBase(String classPath) throws Exception { KieServices kieServices = KieServices.Factory.get(); KieFileSystem kfs = kieServices.newKieFileSystem(); Resource resource = kieServices.getResources().newClassPathResource(classPath); resource.setResourceType(ResourceType.DRL); kfs.write(resource); KieBuilder kieBuilder = kieServices.newKieBuilder(kfs).buildAll(); if (kieBuilder.getResults().getMessages(Message.Level.ERROR).size() > 0) { throw new Exception(); } KieContainer kieContainer = kieServices.newKieContainer(kieServices.getRepository().getDefaultReleaseId()); KieBase kBase = kieContainer.getKieBase(); return kBase; } /** * 根据服务器真实路径下的xls文件生成drl文件内容 */ public static KieSession getKieSessionFromXLS(String realPath) throws FileNotFoundException { return createKieSessionFromDRL(getDRL(realPath)); } // 把xls文件解析为String public static String getDRL (String realPath) throws FileNotFoundException { File file = new File(realPath); // 例如:C:\\abc.xls InputStream is = new FileInputStream(file); SpreadsheetCompiler compiler = new SpreadsheetCompiler(); return compiler.compile(is, InputType.XLS); } // drl为含有内容的字符串 public static KieSession createKieSessionFromDRL(String drl) { KieHelper kieHelper = new KieHelper(); kieHelper.addContent(drl, ResourceType.DRL); Results results = kieHelper.verify(); if (results.hasMessages(Message.Level.WARNING, Message.Level.ERROR)) { List messages = results.getMessages(Message.Level.WARNING, Message.Level.ERROR); for (Message message : messages) { System.out.println("Error: "+message.getText()); } throw new IllegalStateException("Compilation errors were found. Check the logs."); } return kieHelper.build().newKieSession(); } } 创建一个测试实体类,以及一个rule.drl规则文件: @Data public class UserInfo { private String name; private Integer age; private List interests; private Map tags; }

关于rule.drl文件放置的位置,工具类KieSessionUtils 的getAllRules()方法会解析工程resource目录下rules文件夹下的所有drl文件,你可以放在这里。在这里插入图片描述 newKieSession()里面参数是绝对路径,解析单一的drl文件,测试的rule.drl:

package rules; dialect "java" import com.gaolang.entity.*; rule "评估用户" when $u : UserInfo(name == "张" || name == "李") then System.err.println("用户"+$u); end 测试代码: @Test public void test01() throws Exception { UserInfo userInfo = new UserInfo(); userInfo.setName("李"); KieSession kieSession = KieSessionUtils.getAllRules(); kieSession.insert(userInfo); // kieSession.getAgenda().getAgendaGroup("abc").setFocus(); kieSession.fireAllRules(); kieSession.dispose(); }

测试的结果:它是与关系式匹配的,会看到输出: 在这里插入图片描述

快速整合

创建一个springboot项目,不会创建的可以参考这篇博客:【Spring Boot】快速上手SpringBoot

引入我们的drools依赖: 关于这个依赖的网址:https://github.com/hongwen1993/fast-drools-spring-boot-starter

com.github.hongwen1993 fast-drools-spring-boot-starter 8.0.8

配合测试可能还需要引入的依赖:

junit junit 4.13.2 test org.projectlombok lombok 1.18.20 官方的配置文件,放到项目的application.properties中: ################## 必填属性 ################## # 指定规则文件目录,会自动扫描该目录下所有规则文件,决策表,以及CSV文件 # 支持classpath资源目录,如:classpath:drools/**/*.drl # win 系统注意使用反斜杠,如:C:\\DRL\\ # linux 系统注意使用斜杠,如:/usr/local/drl/ spring.drools.path = C:\\DRL\\ ################## 可选属性 ################## # 也可以指定全局的mode,选择stream或cloud(默认stream模式) spring.drools.mode = stream # 自动更新,on 或 off(默认开启) spring.drools.auto-update = on # 指定规则文件自动更新的周期,单位秒(默认30秒扫描偶一次) spring.drools.update = 10 # 规则监听日志,on 或 off(默认开启) spring.drools.listener = on # 开启 drl 语法检查,on 或 off(默认关闭) spring.drools.verify = off

上面配置文件的修改spring.drools.path部分

# 支持classpath资源目录,如:classpath:drools/**/*.drl # win 系统注意使用反斜杠,如:C:\\DRL\\ # linux 系统注意使用斜杠,如:/usr/local/drl/ 和上面相同的测试实体类和drl文件: @Autowired private KieTemplate kieTemplate; @Before public void before() throws InterruptedException { Thread.sleep(1000); } @Test void test02() throws Exception { KieSession session = kieTemplate.getKieSession("rule01.drl"); UserInfo userInfo = new UserInfo(); userInfo.setName("李"); session.insert(userInfo); session.fireAllRules(); session.dispose(); }

测试结果是相同的。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3